//
// Created by DengLibin on 2018/12/13 0013.
//

#include <string>
#include <vector>
#include <list>
#include <set>
#include <algorithm>
#include <iostream>
#include <functional>
#include <iterator>
using namespace std;


//打印list
struct print
{
    void operator()(int & i)
    {
        cout << i <<" ";
    }
};

//函数(将元素+10)
template <typename T>
int increase(T &t)
{
    return t += 10;
}
//transform算法
void my_transform()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(4);
    //将元素+10
    transform(v.begin(), v.end(), v.begin(), increase<int>);
    struct print p;
    for_each(v.begin(), v.end(), p);
    cout <<endl;


    //使用预定义的仿函数(函数对象)将元素取负值
    transform(v.begin(), v.end(), v.begin(), negate<int>());


    list<int> l; //双向链表
    l.resize(3);//指定大小
    //使用函数适配器 将元素乘10然后放到list中(v的元素不变)
    transform(v.begin(), v.end(), l.begin(), bind2nd(multiplies<int>(), 10));


    //取负值后接输出到屏幕 需要 引入<iterator>
    transform(v.begin(), v.end(), ostream_iterator<int>(cout, " "), negate<int>());
}

int main33()
{
    my_transform();
    return 0;
}